package lib.gameEngine.core{
	
	import flash.display.Sprite;
	
	import lib.gameEngine.common.data.Notification;
	
	/**
	 * 三层结构（Controller,View,Model）的基类
	 * 
	 * 该基类提供了对通知的注册和访问，也提供了对三层结构子类的注册，删除，获取。
	 * 
	 * 当三层结构的子类被删除时，应调用destructor来执行收尾工作
	 * 
	 * 
	 *  
	 * @author Sunix
	 * 
	 */	
	public class Core{
		private var _notifyMap:Object;  //通知哈希表
		private var _name:String;       //具体结构的名称
		private var _frame:Frame;       //框架实例
		
		/**
		 * 构造函数
		 * 
		 *  
		 * @param name 三层结构（Controller,View,Model）的名称
		 * 
		 */		
		public function Core(name:String){
			_notifyMap = new Object();
			_name = name;
			_frame = Frame.getInstance();
			registerNotify();
		}
		
		/**
		 * 获取通知哈希表
		 * 
		 *  
		 * @return 通知哈希表
		 * 
		 */
		public function getNotifyMap():Object{
			return _notifyMap;
		}
		
		/**
		 * 获取结构名称
		 * 
		 *  
		 * @return 三层结构（Controller,View,Model）的名称
		 * 
		 */		
		public function getName():String{
			return _name;
		}
		
		/**
		 * 销毁方法
		 * 
		 * 子类在进行销毁的时候需要编写destructor方法，来对销毁进行更具体的操作
		 *  
		 * 
		 */		
		public function destory():void{
			removeNotifyAll();
			destructor();
		}
		
		/**
		 * 注册通知
		 *  
		 * 
		 */		
		protected function registerNotify():void{}  
		
		/**
		 * 增加通知监听
		 *  
		 * @param name 通知名称
		 * @param fun  回调函数
		 * 
		 */		
		protected function addNotify(name:*,fun:Function):void{ 
			_notifyMap[name] = fun;
		}
		
		/**
		 * 移除通知
		 * 
		 *  
		 * @param name 通知名称
		 * 
		 */		
		protected function removeNotify(name:String):void{ 
			delete _notifyMap[name];
			_frame.removeNotify(name,this);
		}
		
		/**
		 * 析构函数
		 * 
		 *  
		 * 
		 */		
		protected function destructor():void{}
		
		// 以下的各种方并不是必须存在的，其实在使用的时候是可以在外部获取Frame的单例然后执行具体的逻辑。
		// 但是，为了方便与代码的整洁，故将这些函数放置在此，方便子类应用	
		
		
		/**
		 * 发送通知
		 *  
		 * @param notify 通知实例
		 * 
		 */		
		protected function sendNotify(notify:Notification):void{
			_frame.sendNotify(notify);
		}

		/**
		 * 注册控制器
		 * 
		 *  
		 * @param controller 控制器实例
		 * 
		 */		
		protected function registerController(controller:Controller):Controller{  //注册控制器
			_frame.registerController(controller,this);
			return controller;
		}
		
		/**
		 * 获取控制器
		 * 
		 *  
		 * @param name 控制器名称
		 * @return   控制器实例
		 * 
		 */		
		protected function getController(name:String):Controller{  //获取控制器
			return _frame.getController(name,this)
		}
		
		/**
		 * 删除控制器
		 * 
		 *  
		 * @param name 控制器名称
		 * 
		 */		
		protected function deleteController(name:String):void{ 
			return _frame.deleteController(name,this)
		}
		
		/**
		 * 注册视图
		 * 
		 *  
		 * @param view 视图实例
		 * 
		 */		
		protected function registerView(view:View):View{  
			 _frame.registerView(view,this);
			 return view;
		}
		
		/**
		 * 获取视图
		 * 
		 *  
		 * @param name 视图名称
		 * @return  视图实例
		 * 
		 */		
		protected function getView(name:String):View{  
			return _frame.getView(name,this)
		}
		
		/**
		 * 删除视图
		 * 
		 *  
		 * @param name 视图名称
		 * 
		 */		
		protected function deleteView(name:String):void{  
			return _frame.deleteView(name,this)
		}
		
		/**
		 * 注册模型
		 * 
		 *  
		 * @param model 模型实例
		 * 
		 */		
		protected function registerModel(model:Model):Model{  
			 _frame.registerModel(model,this);
			 return model
		}
		
		/**
		 * 获取模型
		 * 
		 *  
		 * @param name 模型名称
		 * @return  模型实例
		 * 
		 */		
		protected function getModel(name:String):Model{ 
			return _frame.getModel(name,this);
		}
		
		/**
		 * 删除模型
		 * 
		 *  
		 * @param name 模型名称
		 * 
		 */		
		protected function deleteModel(name:String):void{  
			return _frame.deleteModel(name,this)
		}
		
		/**
		 * 获取主舞台
		 *  
		 * @return 主舞台对象
		 * 
		 */		
		protected function getSprite():Sprite{  
			return _frame.getSprite();
		}
		
		
		//TODO  获取权限的判断
		protected function getMapLayer():Sprite{
			return _frame.getMapLayer();
		}
		
		protected function getGameLayer():Sprite{
			return _frame.getGameLayer();
		}
		
		protected function getWinLayer():Sprite{
			return _frame.getWinLayer();
		}
/******************************************** private *************************************************/
		private function removeNotifyAll():void{   //移除全部通知
			for(var name:* in _notifyMap){
				removeNotify(name);
			}
		}
	}
}